package com.cloud.rocketmq.listener;

import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState;
import org.springframework.messaging.Message;

//        事务监听
@Slf4j
@RocketMQTransactionListener(txProducerGroup = "productGroup")
public class ProductTransactionListener implements RocketMQLocalTransactionListener {
    //正常事务过程
    @Override
    public RocketMQLocalTransactionState executeLocalTransaction(Message message, Object o) {
        // todo 执行本地方法

        return RocketMQLocalTransactionState.COMMIT;
    }

    //事务补偿过程

    /**
     * 检查本地事务的状态
     * 回查间隔时间：系统默认每隔60秒发起一次定时任务，对未提交的半事务消息进行回查，共持续12小时。
     * 第一次消息回查最快
     */
    @Override
    public RocketMQLocalTransactionState checkLocalTransaction(Message message) {
        // 检查事务状态，如果成功，需要手动commit
        String transactionId = message.getHeaders().get("__transactionId__").toString();
        log.info("检查本地事务状态，transactionId：{}", transactionId);
        // todo  查看本地事务是否执行完成，commit，消费者才可以消费
        //回滚
        return RocketMQLocalTransactionState.COMMIT;
    }
}